﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using TestesFixacao.Dominio.Modelos;

namespace TestesFixacao.Dominio.Repositorios.ADO
{
    public class RepositorioAdoDisciplina : IRepositorioDisciplina
    {
        private IRepositorioMateria _repositorioMateria = new RepositorioAdoMateria();

        #region querys

        private const string SqlInsereDisciplina =
            @"INSERT INTO [TBDisciplina]
                ([nome])
            VALUES
                ({0}nome)";

        private const string SqlEditaDisciplina =
            @"UPDATE [TBDisciplina]
                SET
                    [nome]={0}nome

                WHERE [numero]={0}numero";

        private const string SqlExcluiDisciplina =
           @"DELETE FROM [TBDisciplina]
                WHERE [numero]={0}numero";

        private const string SqlSelecionaTodasDisciplinas =
           @"SELECT
                NUMERO,
                NOME
            FROM
                [TBDisciplina]";

        private const string SqlSelecionaDisciplinaPorNumero =
           @"SELECT
                NUMERO,
                NOME
            FROM
                [TBDisciplina]
            WHERE [numero]={0}numero";

        #endregion querys

        #region IRepositorio

        public void Adiciona(Disciplina disciplina)
        {
            disciplina.Numero = Db.Insert(SqlInsereDisciplina, GetParametros(disciplina));
        }

        public void Edita(Disciplina disciplina)
        {
            Db.Update(SqlEditaDisciplina, GetParametros(disciplina));
        }

        public void Exclui(Disciplina disciplina)
        {
            try
            {
                Db.Delete(SqlExcluiDisciplina, new object[] { "Numero", disciplina.Numero });
            }
            catch (Exception e)
            {
                throw new Exception("A disciplina não pode ser excluida pois está relacionada a um Teste.", e);
            }
        }

        public Disciplina SelecionaPorId(int numero)
        {
            return Db.Get(SqlSelecionaDisciplinaPorNumero, Converter, new object[] { "Numero", numero });
        }

        public List<Disciplina> SelecionaTodos()
        {
            List<Disciplina> disciplinas = Db.GetAll<Disciplina>(SqlSelecionaTodasDisciplinas, Converter);

            foreach (Disciplina disciplina in disciplinas)
            {
                List<Materia> materia = _repositorioMateria.SelecionaTodosPorDisciplina(disciplina);
                //disciplina.
            }

            return disciplinas;
        }

        #endregion IRepositorio

        public Disciplina Converter(IDataReader reader)
        {
            Disciplina disciplina = new Disciplina();

            disciplina.Numero = Convert.ToInt32(reader["numero"]);
            disciplina.Nome = Convert.ToString(reader["nome"]);

            return disciplina;
        }

        private object[] GetParametros(Disciplina disciplina)
        {
            return new object[]
            {
                "Numero", disciplina.Numero,
                "Nome", disciplina.Nome
            };
        }
    }
}